﻿using System;
using System.Drawing;
using PhantomChainsAnalyser.Model;
using ZedGraph;

namespace PhantomChainsAnalyser.View
{
    public class Drawer
    {
        public void DrawGraph(ZedGraphControl control, Sampling sampling, int type,double Source)
        {
            GraphPane pane = control.GraphPane;// Получим панель для рисования     
            pane.CurveList.Clear();// Очистим список кривых
            string Name = "";
            switch (type)
            {
                case 0:
                    pane.Title.Text = "Распределение энтропии";
                    pane.XAxis.Title.Text = "H";
                    Name = "Частота сгенерированных цепочек";
                    break;
                case 1:
                    pane.Title.Text = "Распределение регулярности";
                    pane.XAxis.Title.Text = "r";
                    Name = "Частота сгенерированных цепочек";
                    break;
                case 2:
                    pane.Title.Text = "Распределение среднегеометрических интервалов";
                    pane.XAxis.Title.Text = "∆G";
                    Name = "Частота сгенерированных цепочек";
                    break;
                default:
                    throw new Exception("Неизвестный тип характеристики");
            }
            pane.YAxis.Title.Text = "N";
            IntervalDivider Divider = new IntervalDivider();
            Divider.Divide(sampling);
            double[] x = new double[Divider.Values.Count];
            double[] y = new double[Divider.Values.Count];
            double MaxValue = 0;
            for (int i = 0; i < Divider.Values.Count; i++)
            {
                x[i] = (Divider.Borders[i] + Divider.Borders[i + 1]) / 2;
                double Temp = (double)Divider.Values[i] / sampling.GetVolume();
                if (Temp > MaxValue)
                {
                    MaxValue = Temp;
                }
                y[i] = Temp;
            }
            BarItem myBar = pane.AddBar(Name, x, y, Color.Empty);
            myBar.Bar.Fill = new Fill(Color.Empty, Color.Empty, Color.Empty);
            myBar.Bar.Border.Color = Color.BlueViolet;
            pane.BarSettings.MinClusterGap = 0;
            PointPairList list = new PointPairList();  // Создадим список точек
            list.Add(Source, 0);
            LineItem myCurve = pane.AddCurve("Исходная цепь", list, Color.DarkOrange, SymbolType.Diamond);
            // У кривой линия будет невидимой
            myCurve.Line.IsVisible = false;
            // Тип заполнения - сплошная заливка
            myCurve.Symbol.Fill.Type = FillType.Solid;
            // Размер ромбиков
            myCurve.Symbol.Size = 15;
            // Устанавливаем интересующий нас интервал по оси X
            pane.XAxis.Scale.Min = sampling.Min() - (sampling.Max() - sampling.Min()) / 50;
            pane.XAxis.Scale.Max = sampling.Max() + (sampling.Max() - sampling.Min()) / 50;
            // Устанавливаем интересующий нас интервал по оси Y
            pane.YAxis.Scale.Max = MaxValue + 0.005;
            pane.YAxis.Scale.Min = 0;
            // Включаем отображение сетки напротив крупных рисок по оси X
            pane.XAxis.MajorGrid.IsVisible = true;
            // Задаем вид пунктирной линии для крупных рисок по оси X:
            // Длина штрихов равна 10 пикселям, ... 
            pane.XAxis.MajorGrid.DashOn = 10;
            // затем 5 пикселей - пропуск
            pane.XAxis.MajorGrid.DashOff = 5;
            // Включаем отображение сетки напротив крупных рисок по оси Y
            pane.YAxis.MajorGrid.IsVisible = true;
            // Аналогично задаем вид пунктирной линии для крупных рисок по оси Y
            pane.YAxis.MajorGrid.DashOn = 10;
            pane.YAxis.MajorGrid.DashOff = 5;
            // Включаем отображение сетки напротив мелких рисок по оси X
            pane.YAxis.MinorGrid.IsVisible = true;
            // Задаем вид пунктирной линии для крупных рисок по оси Y: 
            // Длина штрихов равна одному пикселю, ... 
            pane.YAxis.MinorGrid.DashOn = 1;
            // затем 2 пикселя - пропуск
            pane.YAxis.MinorGrid.DashOff = 2;
            // Включаем отображение сетки напротив мелких рисок по оси Y
            pane.XAxis.MinorGrid.IsVisible = true;
            // Аналогично задаем вид пунктирной линии для крупных рисок по оси Y
            pane.XAxis.MinorGrid.DashOn = 1;
            pane.XAxis.MinorGrid.DashOff = 2;
            //Цвет сетки
            pane.XAxis.MajorGrid.Color = Color.LightGray;
            pane.YAxis.MajorGrid.Color = Color.LightGray;
            pane.XAxis.MinorGrid.Color = Color.LightGray;
            pane.YAxis.MinorGrid.Color = Color.LightGray;
            //Оси
            pane.XAxis.MajorGrid.IsZeroLine = true;
            pane.YAxis.MajorGrid.IsZeroLine = true;
            // Вызываем метод AxisChange (), чтобы обновить данные об осях. 
            // В противном случае на рисунке будет показана только часть графика, 
            // которая умещается в интервалы по осям, установленные по умолчанию
            control.AxisChange();
            control.Invalidate(); // Обновляем график
        }

        /// <summary>
        /// метод очищает полотно для рисования
        /// </summary>
        /// <param name="control"></param>
        public void Clear(ZedGraphControl control)
        {
            // Получим панель для рисования
            GraphPane pane = control.GraphPane;

            // Очистим список кривых
            pane.CurveList.Clear();

            // Обновляем график
            control.Invalidate();
        }
    }
}